package string;

/**
 * 给你一个二进制字符串 s（仅由 '0' 和 '1' 组成的字符串）。
 * 返回所有字符都为 1 的子字符串的数目。
 * 由于答案可能很大，请你将它对 10^9 + 7 取模后返回。
 * <p>
 * 示例 1：
 * 输入：s = "0110111"
 * 输出：9
 * 解释：共有 9 个子字符串仅由 '1' 组成
 * "1" -> 5 次
 * "11" -> 3 次
 * "111" -> 1 次
 * <p>
 * 示例 2：
 * 输入：s = "101"
 * 输出：2
 * 解释：子字符串 "1" 在 s 中共出现 2 次
 * <p>
 * 示例 3：
 * 输入：s = "111111"
 * 输出：21
 * 解释：每个子字符串都仅由 '1' 组成
 * <p>
 * 示例 4：
 * 输入：s = "000"
 * 输出：0
 *
 * @author Jisheng Huang
 * @version 20250512
 */
public class NumSubstrWithOnlyOne_1513 {
    /**
     * Given a string s. Return the possible cases of substring that only contains 1
     *
     * @param s the given string
     * @return the number of possible cases of substring with only digit 1
     */
    public static int numSub(String s) {
        int MOD = 1000000007;
        long total = 0;
        int length = s.length();
        long consecutive = 0;

        for (int i = 0; i < length; ++i) {
            char c = s.charAt(i);

            // If the current character is '0', calculate the number of possible case with (n * (n + 1)) / 2
            if (c == '0') {
                total += consecutive * (consecutive + 1) / 2;
                total %= MOD;
                consecutive = 0;
            } else {
                ++consecutive;
            }
        }

        total += consecutive * (consecutive + 1) / 2;
        total %= MOD;

        return (int) total;
    }

    public static void main(String[] args) {
        String s = "0110111";
        System.out.println(numSub(s));

        s = "101";
        System.out.println(numSub(s));

        s = "111111";
        System.out.println(numSub(s));

        s = "000";
        System.out.println(numSub(s));
    }
}
